package com.cyou.dream.rule;

import com.cyou.dream.application.ApplicationCommon;
import com.cyou.dream.context.RuleContext;
import com.cyou.dream.core.IRule;
import com.cyou.dream.define.ERule;
import com.cyou.dream.define.ERuleParam;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Collections;
import java.util.List;

/**
 * TimeWindowCounterRule 类实现了时间窗口计数器规则。
 * 该规则用于在指定的时间窗口内对某个键的访问次数进行计数，并判断是否超过设定的阈值。
 * 该规则的参数如下：
 * <ul> {@code ERuleParam.THRESHOLD} - 访问次数阈值。 </ul>
 * <ul> {@code ERuleParam.WINDOW_SECONDS} - 时间窗口大小，单位为秒。 </ul>
 * <p>
 * <p>
 * 示例场景：限流拦截器，每个接口一秒内最多访问10次。
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class TimeWindowCounterRule implements IRule {

    @Override
    public boolean evaluate(RuleContext context) {
        List<String> keys = Collections.singletonList(context.getActualKey());
        Object[] args = {
                context.getRuleParams().get(ERuleParam.WINDOW_SECONDS.getKey()),
                context.getRuleParams().get(ERuleParam.THRESHOLD.getKey())
        };

        RedisTemplate redisTemplate = ApplicationCommon.context().getBean("redisTemplate", RedisTemplate.class);

        Long result = (Long) redisTemplate.execute(
                ERule.TIME_WINDOW_COUNTER.getRuleScript(),
                keys,
                args
        );
        return result == 1;
    }
}